#ifndef xpack_math_size
#define xpack_math_size
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::math_size::inc
#include"define/base_type.hpp"
#include"macro/xexport.hpp"
#include"macro/xstruct.hpp"
#pragma pop_macro("xuser")

namespace mixc::math_size{
    #define xarg_name       size
    #define xarg_a0         width
    #define xarg_a1         height
    #define xarg_a2         length
    #include"math/private/xgen.geometry.hpp"
}

namespace mixc::math_size::origin{
    template<class width_t, class height_t = width_t, class length_t = void>
    using size = mixc::math_size::size<width_t, height_t, length_t>;

    //                  w    h
    using sz2b  = size<u08, u08>;
    using sz2w  = size<u16, u16>;
    using sz2d  = size<u32, u32>;
    using sz2q  = size<u64, u64>;
    using sz2u  = size<uxx, uxx>;
    using sz2bx = size<i08, i08>;
    using sz2wx = size<i16, i16>;
    using sz2dx = size<i32, i32>;
    using sz2qx = size<i64, i64>;
    using sz2x  = size<ixx, ixx>;
    using sz2s  = size<f32, f32>;
    using sz2f  = size<f64, f64>;

    //                  w    h    l
    using sz3b  = size<u08, u08, u08>;
    using sz3w  = size<u16, u16, u16>;
    using sz3d  = size<u32, u32, u32>;
    using sz3q  = size<u64, u64, u64>;
    using sz3u  = size<uxx, uxx, uxx>;
    using sz3bx = size<i08, i08, i08>;
    using sz3wx = size<i16, i16, i16>;
    using sz3dx = size<i32, i32, i32>;
    using sz3qx = size<i64, i64, i64>;
    using sz3x  = size<ixx, ixx, ixx>;
    using sz3s  = size<f32, f32, f32>;
    using sz3f  = size<f64, f64, f64>;
}

#endif

xexport_space(mixc::math_size::origin)
